From 742158045621e2d25916877d139cdd8d8688f1a8 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Wed, 2 Oct 2024 02:03:54 +0530 Subject: [PATCH] source-easypost contribution from btkcodedev (#46287) Co-authored-by: Octavia Squidington III Co-authored-by: Natik Gadzhi --- .../connectors/source-easypost/README.md | 37 + .../acceptance-test-config.yml | 17 + .../connectors/source-easypost/icon.svg | 9 + .../connectors/source-easypost/manifest.yaml | 1713 +++++++++++++++++ .../connectors/source-easypost/metadata.yaml | 35 + docs/integrations/sources/easypost.md | 39 + 6 files changed, 1850 insertions(+) create mode 100644 airbyte-integrations/connectors/source-easypost/README.md create mode 100644 airbyte-integrations/connectors/source-easypost/acceptance-test-config.yml create mode 100644 airbyte-integrations/connectors/source-easypost/icon.svg create mode 100644 airbyte-integrations/connectors/source-easypost/manifest.yaml create mode 100644 airbyte-integrations/connectors/source-easypost/metadata.yaml create mode 100644 docs/integrations/sources/easypost.md diff --git a/airbyte-integrations/connectors/source-easypost/README.md b/airbyte-integrations/connectors/source-easypost/README.md new file mode 100644 index 000000000000..755610b06164 --- /dev/null +++ b/airbyte-integrations/connectors/source-easypost/README.md @@ -0,0 +1,37 @@ +# Easypost +This directory contains the manifest-only connector for [`source-easypost`](https://www.easypost.com/). + +## Documentation reference: +- Visit `https://docs.easypost.com/docs/addresses` for API documentation + +## Authentication setup +`EasyPost` uses api key authentication routed as Basic Http, Visit `https://docs.easypost.com/docs/authentication` for getting your api keys. + +## 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-easypost:dev`) that you can use to test the connector locally. +```bash +airbyte-ci connectors --name=source-easypost build +``` + +### Test +This will run the acceptance tests for the connector. +```bash +airbyte-ci connectors --name=source-easypost test +``` + diff --git a/airbyte-integrations/connectors/source-easypost/acceptance-test-config.yml b/airbyte-integrations/connectors/source-easypost/acceptance-test-config.yml new file mode 100644 index 000000000000..e489fdbb5f04 --- /dev/null +++ b/airbyte-integrations/connectors/source-easypost/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-easypost: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-easypost/icon.svg b/airbyte-integrations/connectors/source-easypost/icon.svg new file mode 100644 index 000000000000..541adf339bf8 --- /dev/null +++ b/airbyte-integrations/connectors/source-easypost/icon.svg @@ -0,0 +1,9 @@ + +Created with Fabric.js 3.5.0 + + + + + + + \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-easypost/manifest.yaml b/airbyte-integrations/connectors/source-easypost/manifest.yaml new file mode 100644 index 000000000000..730d7cea58b4 --- /dev/null +++ b/airbyte-integrations/connectors/source-easypost/manifest.yaml @@ -0,0 +1,1713 @@ +version: 5.7.5 + +type: DeclarativeSource + +description: |- + Website: https://www.easypost.com/ + API Docs: https://docs.easypost.com/docs/addresses + Auth Docs: https://docs.easypost.com/docs/authentication + +check: + type: CheckStream + stream_names: + - batches + +definitions: + streams: + batches: + type: DeclarativeStream + name: batches + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: batches + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - batches + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/batches" + addresses: + type: DeclarativeStream + name: addresses + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: addresses + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - addresses + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/addresses" + trackers: + type: DeclarativeStream + name: trackers + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: trackers + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - trackers + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/trackers" + metadata_carriers: + type: DeclarativeStream + name: metadata_carriers + primary_key: + - name + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: metadata/carriers + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - carriers + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/metadata_carriers" + end_shippers: + type: DeclarativeStream + name: end_shippers + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: end_shippers + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - end_shippers + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/end_shippers" + webhooks: + type: DeclarativeStream + name: webhooks + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: webhooks + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - webhooks + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/webhooks" + users_children: + type: DeclarativeStream + name: users_children + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: users/children + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - children + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/users_children" + carrier_accounts: + type: DeclarativeStream + name: carrier_accounts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: carrier_accounts + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/carrier_accounts" + api_keys: + type: DeclarativeStream + name: api_keys + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: api_keys + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limits hit + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + action: FAIL + http_codes: + - 403 + error_message: Need Production API key for accessing this stream + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + paginator: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: page_size + inject_into: request_parameter + page_token_option: + type: RequestOption + field_name: before_id + inject_into: request_parameter + pagination_strategy: + type: CursorPagination + page_size: 10 + cursor_value: "{{ last_record.id }}" + stop_condition: '{{ not response.get("has_more", {}) }}' + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/api_keys" + base_requester: + type: HttpRequester + url_base: https://api.easypost.com/v2/ + authenticator: + type: BasicHttpAuthenticator + username: '{{ config["username"] }}' + +streams: + - $ref: "#/definitions/streams/batches" + - $ref: "#/definitions/streams/addresses" + - $ref: "#/definitions/streams/trackers" + - $ref: "#/definitions/streams/metadata_carriers" + - $ref: "#/definitions/streams/end_shippers" + - $ref: "#/definitions/streams/webhooks" + - $ref: "#/definitions/streams/users_children" + - $ref: "#/definitions/streams/carrier_accounts" + - $ref: "#/definitions/streams/api_keys" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - username + - start_date + properties: + username: + type: string + description: The API Key from your easypost settings + order: 0 + title: API Key + airbyte_secret: true + start_date: + type: string + order: 1 + title: Start date + format: date-time + pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ + additionalProperties: true + +metadata: + autoImportSchema: + batches: true + addresses: true + trackers: true + metadata_carriers: true + end_shippers: true + webhooks: true + users_children: true + carrier_accounts: true + api_keys: true + yamlComponents: + streams: + batches: + - paginator + addresses: + - paginator + trackers: + - paginator + end_shippers: + - paginator + webhooks: + - paginator + users_children: + - paginator + carrier_accounts: + - paginator + api_keys: + - paginator + global: + - authenticator + testedStreams: + batches: + streamHash: fccaea7eeddb4c513128efc568ac55131b934979 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + addresses: + streamHash: be217831e0b9a2b7610ed8f5322e159761cf41e1 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + trackers: + streamHash: 937d093c2f7555350d80dee4f8f59da833a08eed + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + metadata_carriers: + streamHash: d20a09a7be288f5aef273632fa7da0f1a33d6018 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + end_shippers: + streamHash: 2b3a1cdc2aa8eb2d7c426acddcd78be0b5c25c69 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + webhooks: + streamHash: ebf1c00b0f94d463c36122ac90d91376b63fc0a0 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + users_children: + streamHash: 18f2ae5e584acb97c906d02b50e55e975da19d73 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + carrier_accounts: + streamHash: ae7e59e2d8aad15224752cda1c73ef957dcffc26 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + api_keys: + streamHash: fc3d75939089dc24eb6460ca3f7851ee4e6846fb + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + assist: {} + +schemas: + batches: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + created_at: + type: + - string + - "null" + id: + type: string + mode: + type: + - string + - "null" + num_shipments: + type: + - number + - "null" + object: + type: + - string + - "null" + pickup: + type: + - object + - "null" + properties: + address: + type: + - object + - "null" + properties: + city: + type: + - string + - "null" + company: + type: + - string + - "null" + country: + type: + - string + - "null" + created_at: + type: + - string + - "null" + id: + type: + - string + - "null" + mode: + type: + - string + - "null" + object: + type: + - string + - "null" + phone: + type: + - string + - "null" + state: + type: + - string + - "null" + street1: + type: + - string + - "null" + street2: + type: + - string + - "null" + updated_at: + type: + - string + - "null" + verifications: + type: + - object + - "null" + zip: + type: + - string + - "null" + carrier_accounts: + type: + - array + - "null" + created_at: + type: + - string + - "null" + id: + type: + - string + - "null" + instructions: + type: + - string + - "null" + is_account_address: + type: + - boolean + - "null" + max_datetime: + type: + - string + - "null" + messages: + type: + - array + - "null" + min_datetime: + type: + - string + - "null" + mode: + type: + - string + - "null" + object: + type: + - string + - "null" + pickup_rates: + type: + - array + - "null" + reference: + type: + - string + - "null" + status: + type: + - string + - "null" + updated_at: + type: + - string + - "null" + scan_form: + type: + - object + - "null" + properties: + batch_id: + type: + - string + - "null" + created_at: + type: + - string + - "null" + id: + type: + - string + - "null" + message: + type: + - string + - "null" + object: + type: + - string + - "null" + status: + type: + - string + - "null" + tracking_codes: + type: + - array + - "null" + updated_at: + type: + - string + - "null" + shipments: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + batch_status: + type: + - string + - "null" + id: + type: + - string + - "null" + state: + type: + - string + - "null" + status: + type: + - object + - "null" + properties: + created: + type: + - number + - "null" + creation_failed: + type: + - number + - "null" + postage_purchase_failed: + type: + - number + - "null" + postage_purchased: + type: + - number + - "null" + queued_for_purchase: + type: + - number + - "null" + updated_at: + type: string + required: + - id + - updated_at + addresses: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + city: + type: + - string + - "null" + company: + type: + - string + - "null" + country: + type: + - string + - "null" + created_at: + type: + - string + - "null" + email: + type: + - string + - "null" + id: + type: string + mode: + type: + - string + - "null" + name: + type: + - string + - "null" + object: + type: + - string + - "null" + phone: + type: + - string + - "null" + state: + type: + - string + - "null" + street1: + type: + - string + - "null" + street2: + type: + - string + - "null" + updated_at: + type: + - string + - "null" + verifications: + type: + - object + - "null" + zip: + type: + - string + - "null" + required: + - id + trackers: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + carrier: + type: + - string + - "null" + carrier_detail: + type: + - object + - "null" + properties: + destination_location: + type: + - string + - "null" + object: + type: + - string + - "null" + origin_location: + type: + - string + - "null" + origin_tracking_location: + type: + - object + - "null" + properties: + city: + type: + - string + - "null" + object: + type: + - string + - "null" + state: + type: + - string + - "null" + zip: + type: + - string + - "null" + service: + type: + - string + - "null" + created_at: + type: + - string + - "null" + est_delivery_date: + type: + - string + - "null" + fees: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + amount: + type: + - string + - "null" + charged: + type: + - boolean + - "null" + object: + type: + - string + - "null" + refunded: + type: + - boolean + - "null" + id: + type: string + mode: + type: + - string + - "null" + object: + type: + - string + - "null" + public_url: + type: + - string + - "null" + status: + type: + - string + - "null" + status_detail: + type: + - string + - "null" + tracking_code: + type: + - string + - "null" + tracking_details: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + carrier_code: + type: + - string + - "null" + datetime: + type: + - string + - "null" + message: + type: + - string + - "null" + object: + type: + - string + - "null" + source: + type: + - string + - "null" + status: + type: + - string + - "null" + status_detail: + type: + - string + - "null" + tracking_location: + type: + - object + - "null" + properties: + city: + type: + - string + - "null" + object: + type: + - string + - "null" + state: + type: + - string + - "null" + zip: + type: + - string + - "null" + updated_at: + type: string + required: + - id + - updated_at + metadata_carriers: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + human_readable: + type: + - string + - "null" + name: + type: string + predefined_packages: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + carrier: + type: + - string + - "null" + dimensions: + type: + - array + - "null" + items: + type: + - string + - "null" + human_readable: + type: + - string + - "null" + max_weight: + type: + - number + - "null" + name: + type: + - string + - "null" + service_levels: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + carrier: + type: + - string + - "null" + dimensions: + type: + - array + - "null" + items: + type: + - string + - "null" + human_readable: + type: + - string + - "null" + max_weight: + type: + - number + - "null" + name: + type: + - string + - "null" + shipment_options: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + carrier: + type: + - string + - "null" + deprecated: + type: + - boolean + - "null" + human_readable: + type: + - string + - "null" + name: + type: + - string + - "null" + supported_features: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + carrier: + type: + - string + - "null" + name: + type: + - string + - "null" + supported: + type: + - boolean + - "null" + required: + - name + end_shippers: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + city: + type: + - string + - "null" + company: + type: + - string + - "null" + country: + type: + - string + - "null" + created_at: + type: + - string + - "null" + email: + type: + - string + - "null" + id: + type: string + mode: + type: + - string + - "null" + name: + type: + - string + - "null" + object: + type: + - string + - "null" + phone: + type: + - string + - "null" + state: + type: + - string + - "null" + street1: + type: + - string + - "null" + updated_at: + type: + - string + - "null" + zip: + type: + - string + - "null" + required: + - id + webhooks: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + created_at: + type: string + id: + type: string + mode: + type: + - string + - "null" + object: + type: + - string + - "null" + url: + type: + - string + - "null" + required: + - id + - created_at + users_children: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + created_at: + type: string + id: + type: string + name: + type: + - string + - "null" + object: + type: + - string + - "null" + parent_id: + type: + - string + - "null" + phone_number: + type: + - string + - "null" + verified: + type: + - boolean + - "null" + required: + - id + - created_at + carrier_accounts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + description: + type: + - string + - "null" + billing_type: + type: + - string + - "null" + clone: + type: + - boolean + - "null" + created_at: + type: + - string + - "null" + credentials: + type: + - object + - "null" + properties: + address_city: + type: + - string + - "null" + address_state: + type: + - string + - "null" + address_street: + type: + - string + - "null" + address_zip: + type: + - string + - "null" + company_name: + type: + - string + - "null" + phone: + type: + - string + - "null" + shipper_id: + type: + - string + - "null" + fields: + type: + - object + - "null" + properties: + credentials: + type: + - object + - "null" + properties: + address_city: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + address_state: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + address_street: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + address_zip: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + company_name: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + email: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + visibility: + type: + - string + - "null" + phone: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + shipper_id: + type: + - object + - "null" + properties: + label: + type: + - string + - "null" + value: + type: + - string + - "null" + visibility: + type: + - string + - "null" + id: + type: string + object: + type: + - string + - "null" + readable: + type: + - string + - "null" + updated_at: + type: string + required: + - id + - updated_at + api_keys: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + children: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + children: + type: + - array + - "null" + id: + type: + - string + - "null" + keys: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + active: + type: + - boolean + - "null" + created_at: + type: + - string + - "null" + id: + type: + - string + - "null" + key: + type: + - string + - "null" + mode: + type: + - string + - "null" + object: + type: + - string + - "null" + id: + type: string + keys: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + active: + type: + - boolean + - "null" + created_at: + type: + - string + - "null" + id: + type: + - string + - "null" + key: + type: + - string + - "null" + mode: + type: + - string + - "null" + object: + type: + - string + - "null" + required: + - id diff --git a/airbyte-integrations/connectors/source-easypost/metadata.yaml b/airbyte-integrations/connectors/source-easypost/metadata.yaml new file mode 100644 index 000000000000..63ba626ecebe --- /dev/null +++ b/airbyte-integrations/connectors/source-easypost/metadata.yaml @@ -0,0 +1,35 @@ +metadataSpecVersion: "1.0" +data: + allowedHosts: + hosts: + - "api.easypost.com" + registryOverrides: + oss: + enabled: true + cloud: + enabled: true + remoteRegistries: + pypi: + enabled: false + packageName: airbyte-source-easypost + connectorBuildOptions: + baseImage: docker.io/airbyte/source-declarative-manifest:5.8.0@sha256:568b4cf0261ea6909db3ae00a0da6bc21ff2b271529a03683be0125dc27a86a2 + connectorSubtype: api + connectorType: source + definitionId: b74b0cfc-dd2c-4fdd-9bb0-ffc9efe04c36 + dockerImageTag: 0.0.1 + dockerRepository: airbyte/source-easypost + githubIssueLabel: source-easypost + icon: icon.svg + license: MIT + name: Easypost + releaseDate: 2024-10-01 + releaseStage: alpha + supportLevel: community + documentationUrl: https://docs.airbyte.com/integrations/sources/easypost + tags: + - language:manifest-only + - cdk:low-code + ab_internal: + ql: 100 + sl: 100 diff --git a/docs/integrations/sources/easypost.md b/docs/integrations/sources/easypost.md new file mode 100644 index 000000000000..d2c4a2b1b755 --- /dev/null +++ b/docs/integrations/sources/easypost.md @@ -0,0 +1,39 @@ +# Easypost +This directory contains the manifest-only connector for [`source-easypost`](https://www.easypost.com/). + +## Documentation reference: +- Visit [`https://docs.easypost.com/docs/addresses`](https://docs.easypost.com/docs/addresses) for API documentation + +## Authentication setup +`EasyPost` uses api key authentication routed as Basic Http, Visit `https://docs.easypost.com/docs/authentication` for getting your api keys. + +## Configuration + +| Input | Type | Description | Default Value | +|-------|------|-------------|---------------| +| `username` | `string` | API Key. The API Key from your easypost settings | | +| `start_date` | `string` | Start date. | | + +## Streams +| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental | +|-------------|-------------|------------|---------------------|----------------------| +| batches | id | DefaultPaginator | ✅ | ✅ | +| addresses | id | DefaultPaginator | ✅ | ❌ | +| trackers | id | DefaultPaginator | ✅ | ✅ | +| metadata_carriers | name | No pagination | ✅ | ❌ | +| end_shippers | id | DefaultPaginator | ✅ | ❌ | +| webhooks | id | DefaultPaginator | ✅ | ✅ | +| users_children | id | DefaultPaginator | ✅ | ✅ | +| carrier_accounts | id | DefaultPaginator | ✅ | ✅ | +| api_keys | id | DefaultPaginator | ✅ | ❌ | + +## Changelog + +
+ Expand to review + +| Version | Date | Pull Request | Subject | +|------------------|-------------------|--------------|----------------| +| 0.0.1 | 2024-10-01 | [46287](https://github.com/airbytehq/airbyte/pull/46287) | Initial release by [@btkcodedev](https://github.com/btkcodedev) via Connector Builder | + +