diff --git a/airbyte-integrations/connectors/source-taboola/README.md b/airbyte-integrations/connectors/source-taboola/README.md new file mode 100644 index 0000000000000..e4d4de6d6a287 --- /dev/null +++ b/airbyte-integrations/connectors/source-taboola/README.md @@ -0,0 +1,39 @@ +# Taboola +This directory contains the manifest-only connector for `source-taboola`. + +This is the Taboola source that ingests data from the Taboola API. + +Taboola helps you reach customers that convert. Drive business results by reaching people genuinely, effectively at just the right moment https://www.taboola.com/ + +In order to use this source, you must first create an account. Once logged in you can contact Taboola support to provide you with a Client ID, Client Secret and Account ID. Once these credentials have been obtained, you can input them into the appropriate fields. + +You can learn more about the API here https://developers.taboola.com/backstage-api/reference + +## Usage +There are multiple ways to use this connector: +- You can use this connector as any other connector in Airbyte Marketplace. +- You can load this connector in `pyairbyte` using `get_source`! +- You can open this connector in Connector Builder, edit it, and publish to your workspaces. + +Please refer to the manifest-only connector documentation for more details. + +## Local Development +We recommend you use the Connector Builder to edit this connector. + +But, if you want to develop this connector locally, you can use the following steps. + +### Environment Setup +You will need `airbyte-ci` installed. You can find the documentation [here](airbyte-ci). + +### Build +This will create a dev image (`source-taboola:dev`) that you can use to test the connector locally. +```bash +airbyte-ci connectors --name=source-taboola build +``` + +### Test +This will run the acceptance tests for the connector. +```bash +airbyte-ci connectors --name=source-taboola test +``` + diff --git a/airbyte-integrations/connectors/source-taboola/acceptance-test-config.yml b/airbyte-integrations/connectors/source-taboola/acceptance-test-config.yml new file mode 100644 index 0000000000000..982a88d912310 --- /dev/null +++ b/airbyte-integrations/connectors/source-taboola/acceptance-test-config.yml @@ -0,0 +1,17 @@ +# See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) +# for more information about how to configure these tests +connector_image: airbyte/source-taboola:dev +acceptance_tests: + spec: + tests: + - spec_path: "manifest.yaml" + connection: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + discovery: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + basic_read: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + incremental: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + full_refresh: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" diff --git a/airbyte-integrations/connectors/source-taboola/icon.svg b/airbyte-integrations/connectors/source-taboola/icon.svg new file mode 100644 index 0000000000000..ea523afea87b3 --- /dev/null +++ b/airbyte-integrations/connectors/source-taboola/icon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/airbyte-integrations/connectors/source-taboola/manifest.yaml b/airbyte-integrations/connectors/source-taboola/manifest.yaml new file mode 100644 index 0000000000000..7f689ccd34d97 --- /dev/null +++ b/airbyte-integrations/connectors/source-taboola/manifest.yaml @@ -0,0 +1,1260 @@ +version: 5.15.0 + +type: DeclarativeSource + +description: >- + This is the Taboola source that ingests data from the Taboola API. + + + Taboola helps you reach customers that convert. Drive business results by + reaching people genuinely, effectively at just the right moment + https://www.taboola.com/ + + + In order to use this source, you must first create an account. Once logged in + you can contact Taboola support to provide you with a Client ID, Client Secret + and Account ID. Once these credentials have been obtained, you can input them + into the appropriate fields. + + + You can learn more about the API here + https://developers.taboola.com/backstage-api/reference + +check: + type: CheckStream + stream_names: + - account + +definitions: + streams: + account: + type: DeclarativeStream + name: account + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: backstage/api/1.0/users/current/allowed-accounts + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/account" + audiences: + type: DeclarativeStream + name: audiences + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: >- + backstage/api/1.0/{{ + config["account_id"]}}/combined_audiences/resources/audiences + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/audiences" + campaigns: + type: DeclarativeStream + name: campaigns + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /backstage/api/1.0/{{ config["account_id"] }}/campaigns/ + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/campaigns" + motion_ads: + type: DeclarativeStream + name: motion_ads + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: >- + /backstage/api/1.0/{{ config["account_id"] }}/campaigns/{{ + stream_partition.parent_id }}/performance-video/items/ + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + stream: + $ref: "#/definitions/streams/campaigns" + parent_key: id + partition_field: parent_id + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/motion_ads" + audience_rules: + type: DeclarativeStream + name: audience_rules + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: >- + /backstage/api/1.0/{{ config["account_id"] + }}/universal_pixel/custom_audience_rule + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/audience_rules" + campaign_items: + type: DeclarativeStream + name: campaign_items + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: >- + /backstage/api/1.0/{{ config["account_id"] }}/campaigns/{{ + stream_partition.parent_id }}/items/ + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + stream: + $ref: "#/definitions/streams/campaigns" + parent_key: id + partition_field: parent_id + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/campaign_items" + conversion_rules: + type: DeclarativeStream + name: conversion_rules + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: >- + /backstage/api/1.0/{{ config["account_id"] + }}/universal_pixel/conversion_rule + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - results + primary_key: + - id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversion_rules" + base_requester: + type: HttpRequester + url_base: https://backstage.taboola.com + authenticator: + type: OAuthAuthenticator + client_id: "{{ config[\"client_id\"] }}" + grant_type: client_credentials + client_secret: "{{ config[\"client_secret\"] }}" + access_token_name: access_token + refresh_request_body: {} + token_refresh_endpoint: https://backstage.taboola.com/backstage/oauth/token + +streams: + - $ref: "#/definitions/streams/account" + - $ref: "#/definitions/streams/campaigns" + - $ref: "#/definitions/streams/campaign_items" + - $ref: "#/definitions/streams/audience_rules" + - $ref: "#/definitions/streams/conversion_rules" + - $ref: "#/definitions/streams/motion_ads" + - $ref: "#/definitions/streams/audiences" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - client_id + - client_secret + - account_id + properties: + client_id: + type: string + order: 0 + title: Client ID + airbyte_secret: true + account_id: + type: string + description: The ID associated with your taboola account + order: 2 + title: Account ID + client_secret: + type: string + order: 1 + title: Client secret + airbyte_secret: true + additionalProperties: true + +metadata: + assist: {} + testedStreams: + account: + hasRecords: true + streamHash: c0e4963d6cadfe3fa143ae49734e5d9cc889684b + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + audiences: + hasRecords: true + streamHash: 082a5eaa73d4b0c8760b6ddb088d52d34a9c77db + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + campaigns: + hasRecords: true + streamHash: d966feac19f7d299089c2544174b780b40dbda8a + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + motion_ads: + hasRecords: true + streamHash: c2a2b9778f2a76a1e82d96247b87a05aaff86ca1 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + audience_rules: + hasRecords: true + streamHash: c5d52d8fd716911fef81d1e65dd291e4b6332464 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + campaign_items: + hasRecords: true + streamHash: 8baabb3aa0e3b9f19901b527bb844fff967d9b40 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + conversion_rules: + hasRecords: true + streamHash: b00c3d15be83f431de7e5ec6696e6593e1afb9da + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + autoImportSchema: + account: true + audiences: true + campaigns: true + motion_ads: true + audience_rules: true + campaign_items: true + conversion_rules: true + +schemas: + account: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + type: + type: + - string + - "null" + id: + type: number + name: + type: + - string + - "null" + is_fla: + type: + - boolean + - "null" + country: + type: + - string + - "null" + currency: + type: + - string + - "null" + language: + type: + - string + - "null" + is_active: + type: + - boolean + - "null" + account_id: + type: + - string + - "null" + partner_types: + type: + - array + - "null" + items: + type: + - string + - "null" + campaign_types: + type: + - array + - "null" + items: + type: + - string + - "null" + time_zone_name: + type: + - string + - "null" + default_platform: + type: + - string + - "null" + additionalProperties: true + audiences: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + description: + type: + - string + - "null" + id: + type: number + size: + type: + - number + - "null" + provider: + type: + - string + - "null" + data_type: + type: + - string + - "null" + is_archived: + type: + - boolean + - "null" + audience_name: + type: + - string + - "null" + exclude_from_campaigns: + type: + - boolean + - "null" + additionalProperties: true + campaigns: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + type: + type: + - string + - "null" + id: + type: string + name: + type: + - string + - "null" + spent: + type: + - number + - "null" + status: + type: + - string + - "null" + bid_type: + type: + - string + - "null" + comments: + type: + - string + - "null" + cpa_goal: + type: + - number + - "null" + end_date: + type: + - string + - "null" + daily_cap: + type: + - number + - "null" + is_active: + type: + - boolean + - "null" + start_date: + type: + - string + - "null" + bid_strategy: + type: + - string + - "null" + os_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + advertiser_id: + type: + - string + - "null" + branding_text: + type: + - string + - "null" + policy_review: + type: + - object + - "null" + properties: {} + pricing_model: + type: + - string + - "null" + safety_rating: + type: + - string + - "null" + tracking_code: + type: + - string + - "null" + approval_state: + type: + - string + - "null" + city_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + spending_limit: + type: + - number + - "null" + end_date_in_utc: + type: + - string + - "null" + conversion_rules: + type: + - object + - "null" + properties: + rules: + type: + - array + - "null" + activity_schedule: + type: + - object + - "null" + properties: + mode: + type: + - string + - "null" + rules: + type: + - array + - "null" + time_zone: + type: + - string + - "null" + browser_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + country_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + start_date_in_utc: + type: + - string + - "null" + campaign_item_type: + type: + - string + - "null" + platform_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + items: + type: + - string + - "null" + segments_targeting: + type: + - object + - "null" + properties: + AGE: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + href: + type: + - string + - "null" + value: + type: + - array + - "null" + GENDER: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + href: + type: + - string + - "null" + value: + type: + - array + - "null" + audiences_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + marketing_objective: + type: + - string + - "null" + publisher_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + contextual_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + performance_rule_ids: + type: + - array + - "null" + spending_limit_model: + type: + - string + - "null" + day_time_bid_modifier: + type: + - object + - "null" + properties: + values: + type: + - array + - "null" + dma_country_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + external_brand_safety: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + values: + type: + - array + - "null" + is_spend_guard_active: + type: + - string + - "null" + platform_bid_modifier: + type: + - object + - "null" + properties: + values: + type: + - array + - "null" + postal_code_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + href: + type: + - string + - "null" + sub_country_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + publisher_bid_modifier: + type: + - object + - "null" + properties: + values: + type: + - array + - "null" + daily_ad_delivery_model: + type: + - string + - "null" + traffic_allocation_mode: + type: + - string + - "null" + auto_publisher_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + region_country_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + connection_type_targeting: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + value: + type: + - array + - "null" + custom_audience_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + custom_contextual_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + lookalike_audience_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + predefined_targeting_options: + type: + - object + - "null" + properties: + predefined_supply_targeting: + type: + - string + - "null" + contextual_segments_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + marking_label_multi_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + publisher_platform_bid_modifier: + type: + - object + - "null" + properties: + values: + type: + - array + - "null" + publisher_bid_strategy_modifiers: + type: + - object + - "null" + properties: + values: + type: + - array + - "null" + audience_segments_multi_targeting: + type: + - object + - "null" + properties: + href: + type: + - string + - "null" + state: + type: + - string + - "null" + additionalProperties: true + motion_ads: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + description: + type: + - string + - "null" + id: + type: string + url: + type: + - string + - "null" + title: + type: + - string + - "null" + status: + type: + - string + - "null" + gif_url: + type: + - string + - "null" + is_active: + type: + - boolean + - "null" + video_url: + type: + - string + - "null" + campaign_id: + type: + - string + - "null" + custom_data: + type: + - object + - "null" + properties: + custom_id: + type: + - string + - "null" + creative_name: + type: + - string + - "null" + fallback_url: + type: + - string + - "null" + policy_review: + type: + - object + - "null" + properties: {} + approval_state: + type: + - string + - "null" + motion_ads_studio: + type: + - object + - "null" + properties: + vendor_video_id: + type: + - string + - "null" + vendor_template_type: + type: + - string + - "null" + media_upload_source: + type: + - string + - "null" + recommended_fbimage: + type: + - string + - "null" + additionalProperties: true + audience_rules: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + type: + type: + - string + - "null" + id: + type: number + status: + type: + - string + - "null" + category: + type: + - string + - "null" + condition: + type: + - object + - "null" + properties: + value: + type: + - string + - "null" + children: + type: + - array + - "null" + property: + type: + - string + - "null" + predicate: + type: + - string + - "null" + event_name: + type: + - string + - "null" + display_name: + type: + - string + - "null" + advertiser_id: + type: + - string + - "null" + audience_size: + type: + - number + - "null" + last_modified_at: + type: + - string + - "null" + last_modified_by: + type: + - string + - "null" + look_back_window: + type: + - number + - "null" + exclude_from_campaigns: + type: + - boolean + - "null" + additionalProperties: true + campaign_items: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + type: + type: + - string + - "null" + description: + type: + - string + - "null" + id: + type: string + url: + type: + - string + - "null" + title: + type: + - string + - "null" + status: + type: + - string + - "null" + is_active: + type: + - boolean + - "null" + campaign_id: + type: + - string + - "null" + custom_data: + type: + - object + - "null" + properties: + custom_id: + type: + - string + - "null" + creative_name: + type: + - string + - "null" + policy_review: + type: + - object + - "null" + properties: {} + thumbnail_url: + type: + - string + - "null" + approval_state: + type: + - string + - "null" + creative_focus: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + additionalProperties: true + conversion_rules: + type: object + $schema: http://json-schema.org/schema# + required: + - id + properties: + type: + type: + - string + - "null" + id: + type: number + status: + type: + - string + - "null" + effects: + type: + - array + - "null" + category: + type: + - string + - "null" + condition: + type: + - object + - "null" + properties: + value: + type: + - string + - "null" + children: + type: + - array + - "null" + property: + type: + - string + - "null" + predicate: + type: + - string + - "null" + event_name: + type: + - string + - "null" + display_name: + type: + - string + - "null" + advertiser_id: + type: + - string + - "null" + aggregation_type: + type: + - string + - "null" + last_modified_at: + type: + - string + - "null" + last_modified_by: + type: + - string + - "null" + look_back_window: + type: + - number + - "null" + exclude_from_campaigns: + type: + - boolean + - "null" + include_in_total_value: + type: + - boolean + - "null" + include_in_total_conversions: + type: + - boolean + - "null" + view_through_look_back_window: + type: + - number + - "null" + additionalProperties: true diff --git a/airbyte-integrations/connectors/source-taboola/metadata.yaml b/airbyte-integrations/connectors/source-taboola/metadata.yaml new file mode 100644 index 0000000000000..087139f21a1a9 --- /dev/null +++ b/airbyte-integrations/connectors/source-taboola/metadata.yaml @@ -0,0 +1,35 @@ +metadataSpecVersion: "1.0" +data: + allowedHosts: + hosts: + - "backstage.taboola.com" + registryOverrides: + oss: + enabled: true + cloud: + enabled: true + remoteRegistries: + pypi: + enabled: false + packageName: airbyte-source-taboola + connectorBuildOptions: + baseImage: docker.io/airbyte/source-declarative-manifest:5.17.0@sha256:9c6bfd080a247b7781ce5b25687e7c44e29d31315d0bf656584b38810521bbaa + connectorSubtype: api + connectorType: source + definitionId: 40bb20de-e03c-4aa2-80bc-72234598380f + dockerImageTag: 0.0.1 + dockerRepository: airbyte/source-taboola + githubIssueLabel: source-taboola + icon: icon.svg + license: MIT + name: Taboola + releaseDate: 2024-10-28 + releaseStage: alpha + supportLevel: community + documentationUrl: https://docs.airbyte.com/integrations/sources/taboola + tags: + - language:manifest-only + - cdk:low-code + ab_internal: + ql: 100 + sl: 100 diff --git a/docs/integrations/sources/taboola.md b/docs/integrations/sources/taboola.md new file mode 100644 index 0000000000000..422460c4319d8 --- /dev/null +++ b/docs/integrations/sources/taboola.md @@ -0,0 +1,38 @@ +# Taboola +This is the Taboola source that ingests data from the Taboola API. + +Taboola helps you reach customers that convert. Drive business results by reaching people genuinely, effectively at just the right moment https://www.taboola.com/ + +In order to use this source, you must first create an account. Once logged in you can contact Taboola support to provide you with a Client ID, Client Secret and Account ID. Once these credentials have been obtained, you can input them into the appropriate fields. + +You can learn more about the API here https://developers.taboola.com/backstage-api/reference + +## Configuration + +| Input | Type | Description | Default Value | +|-------|------|-------------|---------------| +| `client_id` | `string` | Client ID. | | +| `account_id` | `string` | Account ID. The ID associated with your taboola account | | +| `client_secret` | `string` | Client secret. | | + +## Streams +| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental | +|-------------|-------------|------------|---------------------|----------------------| +| account | id | No pagination | ✅ | ❌ | +| campaigns | id | No pagination | ✅ | ❌ | +| campaign_items | id | No pagination | ✅ | ❌ | +| audience_rules | id | No pagination | ✅ | ❌ | +| conversion_rules | id | No pagination | ✅ | ❌ | +| motion_ads | id | No pagination | ✅ | ❌ | +| audiences | id | No pagination | ✅ | ❌ | + +## Changelog + +
+ Expand to review + +| Version | Date | Pull Request | Subject | +|------------------|-------------------|--------------|----------------| +| 0.0.1 | 2024-10-28 | | Initial release by [@aazam-gh](https://github.com/aazam-gh) via Connector Builder | + +