Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
This SDK uses the Requests library and will work for Python 2.7 — 3.5.
If you are using Django as your platform, we have moesifapi-python middleware, you can use that middleware directly.
Check out Moesif's Developer Documentation and Python API Reference to learn more
pip install moesifapi
The code uses Python packages named requests, jsonpickle and dateutil. After having resolved the dependencies, you can easily use the SDK following these steps.
Your Moesif Application Id can be found in the Moesif Portal. After signing up for a Moesif account, your Moesif Application Id will be displayed during the onboarding steps.
You can always find your Moesif Application Id at any time by logging into the Moesif Portal, click on the top right menu, and then clicking Installation.
from __future__ import print_function
from moesifapi.moesif_api_client import *
from moesifapi.models import *
client = MoesifAPIClient(my_application_id)
api_client = client.api
# Note: we recommend sending all API Calls via MVC framework middleware.
req_headers = APIHelper.json_deserialize(""" {
"Host": "api.acmeinc.com",
"Accept": "*/*",
"Connection": "Keep-Alive",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 5.0.2; C6906 Build/14.5.A.0.242)",
"Content-Type": "application/json",
"Content-Length": "126",
"Accept-Encoding": "gzip"
} """)
req_body = APIHelper.json_deserialize( """{
"items": [
{
"type": 1,
"id": "fwfrf"
},
{
"type": 2,
"id": "d43d3f"
}
]
}""")
rsp_headers = APIHelper.json_deserialize(""" {
"Date": "Tue, 23 Aug 2019 23:46:49 GMT",
"Vary": "Accept-Encoding",
"Pragma": "no-cache",
"Expires": "-1",
"Content-Type": "application/json; charset=utf-8"
"Cache-Control": "no-cache"
} """)
rsp_body = APIHelper.json_deserialize( """{
"Error": "InvalidArgumentException",
"Message": "Missing field field_a"
}""")
metadata = APIHelper.json_deserialize("""{
"field1": "foo",
"field2": "bar"
}""")
event_req = EventRequestModel(time = "2019-09-09T04:45:42.914",
uri = "https://api.acmeinc.com/items/reviews/",
verb = "PATCH",
api_version = "1.1.0",
ip_address = "61.48.220.123",
headers = req_headers,
body = req_body)
event_rsp = EventResponseModel(time = "2019-09-09T04:45:42.914",
status = 500,
headers = rsp_headers,
body = rsp_body)
event_model = EventModel(request = event_req,
response = event_rsp,
user_id = "12345",
company_id = "67890",
session_token = "23jdf0owekfmcn4u3qypxg09w4d8ayrcdx8nu2ng]s98y18cx98q3yhwmnhcfx43f",
metadata = metadata)
# Perform the API call through the SDK function
api_client.create_event(event_model)
api_client.create_event(my_api_event_model)
Create or update a user profile in Moesif.
The metadata field can be any customer demographic or other info you want to store.
Only the userId
field is required.
For details, visit the Python API Reference.
from moesifapi.moesif_api_client import *
from moesifapi.models import *
api_client = MoesifAPIClient("YOUR_COLLECTOR_APPLICATION_ID").api
# Only user_id is required.
# Campaign object is optional, but useful if you want to track ROI of acquisition channels
# See https://www.moesif.com/docs/api#users for campaign schema
# metadata can be any custom object
user = {
'user_id': '12345',
'company_id': '67890', # If set, associate user with a company object
'campaign': {
'utm_source': 'google',
'utm_medium': 'cpc',
'utm_campaign': 'adwords',
'utm_term': 'api+tooling',
'utm_content': 'landing'
},
'metadata': {
'email': 'john@acmeinc.com',
'first_name': 'John',
'last_name': 'Doe',
'title': 'Software Engineer',
'sales_info': {
'stage': 'Customer',
'lifetime_value': 24000,
'account_owner': 'mary@contoso.com'
},
}
}
update_user = api_client.update_user(user)
Similar to UpdateUser, but used to update a list of users in one batch.
Only the userId
field is required.
For details, visit the Python API Reference.
from moesifapi.moesif_api_client import *
from moesifapi.models import *
api_client = MoesifAPIClient("YOUR_COLLECTOR_APPLICATION_ID").api
userA = {
'user_id': '12345',
'company_id': '67890', # If set, associate user with a company object
'metadata': {
'email': 'john@acmeinc.com',
'first_name': 'John',
'last_name': 'Doe',
'title': 'Software Engineer',
'sales_info': {
'stage': 'Customer',
'lifetime_value': 24000,
'account_owner': 'mary@contoso.com'
},
}
}
userB = {
'user_id': '54321',
'company_id': '67890', # If set, associate user with a company object
'metadata': {
'email': 'mary@acmeinc.com',
'first_name': 'Mary',
'last_name': 'Jane',
'title': 'Software Engineer',
'sales_info': {
'stage': 'Customer',
'lifetime_value': 48000,
'account_owner': 'mary@contoso.com'
},
}
}
update_users = api_client.update_users_batch([userA, userB])
Create or update a company profile in Moesif.
The metadata field can be any company demographic or other info you want to store.
Only the companyId
field is required.
For details, visit the Python API Reference.
from moesifapi.moesif_api_client import *
from moesifapi.models import *
api_client = MoesifAPIClient("YOUR_COLLECTOR_APPLICATION_ID").api
# Only company_id is required.
# Campaign object is optional, but useful if you want to track ROI of acquisition channels
# See https://www.moesif.com/docs/api#update-a-company for campaign schema
# metadata can be any custom object
company = {
'company_id': '12345',
'company_domain': 'acmeinc.com', # If domain is set, Moesif will enrich your profiles with publicly available info
'campaign': {
'utm_source': 'google',
'utm_medium': 'cpc',
'utm_campaign': 'adwords',
'utm_term': 'api+tooling',
'utm_content': 'landing'
},
'metadata': {
'org_name': 'Acme, Inc',
'plan_name': 'Free',
'deal_stage': 'Lead',
'mrr': 24000,
'demographics': {
'alexa_ranking': 500000,
'employee_count': 47
},
}
}
update_company = api_client.update_company(company)
Similar to updateCompany, but used to update a list of companies in one batch.
Only the companyId
field is required.
For details, visit the Python API Reference.
from moesifapi.moesif_api_client import *
from moesifapi.models import *
api_client = MoesifAPIClient("YOUR_COLLECTOR_APPLICATION_ID").api
# Only company_id is required.
# Campaign object is optional, but useful if you want to track ROI of acquisition channels
# See https://www.moesif.com/docs/api#update-a-company for campaign schema
# metadata can be any custom object
companies = [{
'company_id': '67890',
'company_domain': 'acmeinc.com', # If domain is set, Moesif will enrich your profiles with publicly available info
'campaign': {
'utm_source': 'google',
'utm_medium': 'cpc',
'utm_campaign': 'adwords',
'utm_term': 'api+tooling',
'utm_content': 'landing'
},
'metadata': {
'org_name': 'Acme, Inc',
'plan_name': 'Free',
'deal_stage': 'Lead',
'mrr': 24000,
'demographics': {
'alexa_ranking': 500000,
'employee_count': 47
},
}
},
{
'company_id': '09876',
'company_domain': 'contoso.com', # If domain is set, Moesif will enrich your profiles with publicly available info
'campaign': {
'utm_source': 'facebook',
'utm_medium': 'cpc',
'utm_campaign': 'retargeting'
},
'metadata': {
'org_name': 'Contoso, Inc',
'plan_name': 'Paid',
'deal_stage': 'Lead',
'mrr': 48000,
'demographics': {
'alexa_ranking': 500000,
'employee_count': 53
},
}
}]
update_company = api_client.update_companies(companies)
Create or update a subscription profile in Moesif. The metadata field can store any subscription-related information you wish to keep. The subscription_id
, company_id
, and status
fields are all required. This method is a convenient helper that calls the Moesif API library. For details, visit the Python API Reference.
from moesifapi.moesif_api_client import *
from moesifapi.models import *
from datetime import datetime, timedelta
api_client = MoesifAPIClient("YOUR_COLLECTOR_APPLICATION_ID").api
# Required fields for a subscription update
subscription = {
'subscription_id': 'sub_3456',
'company_id': '67890',
'current_period_start': datetime.utcnow(),
'current_period_end': datetime.utcnow() + timedelta(days=30),
'status': 'active',
# Optional metadata can be any custom object
'metadata': {
'string_field': 'value_1',
'number_field': 0,
'object_field': {
'field_1': 'value_1',
'field_2': 'value_2'
}
}
}
update_subscription = api_client.update_subscription(subscription)
Similar to updateSubscription
, but used to update a list of subscriptions in one batch. The subscription_id
, company_id
, and status
fields are required for each subscription in the list. This method is a convenient helper that calls the Moesif API library. For details, visit the Python API Reference.
from moesifapi.moesif_api_client import *
from moesifapi.models import *
from datetime import datetime, timedelta
api_client = MoesifAPIClient("YOUR_COLLECTOR_APPLICATION_ID").api
# Required fields for subscription updates in a batch
subscriptions = [{
'subscription_id': 'sub_3456',
'company_id': '67890',
'current_period_start': datetime.utcnow(),
'current_period_end': datetime.utcnow() + timedelta(days=30),
'status': 'active',
# Optional metadata can be any custom object
'metadata': {
'string_field': 'value_1',
'number_field': 0,
'object_field': {
'field_1': 'value_1',
'field_2': 'value_2'
}
}
}, {
'subscription_id': 'sub_34567',
'company_id': '6789',
'current_period_start': datetime.utcnow(),
'current_period_end': datetime.utcnow() + timedelta(days=30),
'status': 'active',
'metadata': {
'string_field': 'value_1',
'number_field': 0,
'object_field': {
'field_1': 'value_1',
'field_2': 'value_2'
}
}
}]
update_subscriptions = api_client.update_subscriptions_batch(subscriptions)
You can test the SDK with automatically generated test cases. unittest is used as the testing framework and nose is used as the test runner. You can run the tests as follows:
FAQs
Moesif API Lib for Python
We found that moesifapi demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.