This guide walks you through using a lightweight Python module to interact with the Mythradon REST API. It provides convenient wrappers around HTTP methods and supports optional HMAC-based authentication.
importrequestsimporturllibclassCrmAPIError(Exception):"""An exception class for API errors"""passdefhttp_build_query(data):parents=[]pairs={}defrender_key(parents):depth=0result=''forxinparents:fmt="[%s]"ifdepth>0orisinstance(x,int)else"%s"result+=fmt%str(x)depth+=1returnresultdefr_urlencode(data):ifisinstance(data,(list,tuple)):fori,iteminenumerate(data):parents.append(i)r_urlencode(item)parents.pop()elifisinstance(data,dict):forkey,valueindata.items():parents.append(key)r_urlencode(value)parents.pop()else:pairs[render_key(parents)]=str(data)returnpairsreturnurllib.parse.urlencode(r_urlencode(data))classCrmAPI:url_path='/api/v1/'def__init__(self,url,api_key):self.url=url.rstrip('/')self.api_key=api_keyself.status_code=Nonedefrequest(self,method,action,params=None):ifparamsisNone:params={}headers={'X-Api-Key':self.api_key}request_url=self.normalize_url(action)ifmethodin['POST','PATCH','PUT']:response=requests.request(method,url=request_url,headers=headers,json=params)else:query_string=http_build_query(params)full_url=f"{request_url}?{query_string}"ifquery_stringelserequest_urlresponse=requests.request(method,url=full_url,headers=headers)self.status_code=response.status_codeifself.status_code!=200:reason=self.parse_reason(response.headers)raiseCrmAPIError(f'API request failed (status {self.status_code}): {reason}')ifnotresponse.content:raiseCrmAPIError('Empty response content from API.')returnresponse.json()defnormalize_url(self,action):returnf"{self.url}{self.url_path}{action}"@staticmethoddefparse_reason(headers):returnheaders.get('X-Status-Reason','Unknown Error')
fromcrm_api_clientimportCrmAPIclient=CrmAPI('https://<your-platform-domain>','your_api_key')# Create a new Leadlead_data={'firstName':'Emily','lastName':'Taylor','phoneNumber':'+61-400-123-456','source':'Web Site','assignedUserId':'6822ef96405f954fa','industry':'Construction',}print(client.request('POST','Lead',lead_data))# Update an existing Leadprint(client.request('PUT','Lead/64ec572ad412296e5',{'lastName':'Alice'}))# Delete an Opportunityprint(client.request('DELETE','Opportunity/6822cbe8baf95a8e3'))# Get a list of Accountsprint(client.request('GET','Account'))# Search for Accounts with Australian phone numberssearch_params={"select":"id,phoneNumber","where":[{"type":"equals","attribute":"phoneNumber","value":"+61"}]}print(client.request('GET','Account',search_params))