Skip to main content

Partner Agent Feed

Expose your agent network to Safiri so your shops, supermarkets, petrol stations and other outlets can become parcel collection and drop-off locations. You host the endpoint; Safiri calls it. Each response contains your complete agent list, with enough information to recreate the businesses, their offices and their associated account holders in Safiri.

Your organisation continues to operate its network. Imported records retain their partner affiliation and external identifiers and are intended to be discoverable alongside Safiri's own agents.

Integration contract

This page specifies version 1 of the partner feed. Safiri's background importer will be implemented separately. The import behaviour below describes that planned integration; this page does not introduce an available Safiri import endpoint.

How the integration works​

  1. Provide Safiri with your HTTPS endpoint URL and a bearer token through the agreed private integration channel.
  2. When Safiri initiates an import, Safiri will fetch the complete response.
  3. New agents will be onboarded automatically from the supplied business, office and account-holder information. Safiri accepts the partner's vetting; agents do not need to repeat the website application and approval process.
  4. Later imports will add new agents, skip unchanged agents and update changed partner-provided information while retaining Safiri's identifiers.

The feed must follow the field types and required structure on this page. Safiri accepts the partner's vetting without repeating the approval process. Tax details, a TIN or VAT certificate, and the account holder's national ID or passport document are still required, along with complete office information.

Endpoint​

The endpoint path is chosen by you. This is an example:

GET https://partner.example/integrations/safiri/agents
Authorization: Bearer <partner-issued-token>
Accept: application/json

The token is issued by your organisation and authorises Safiri to read your feed. It is separate from the tokens used to call Safiri's booking APIs.

curl --request GET \
'https://partner.example/integrations/safiri/agents' \
--header 'Authorization: Bearer REPLACE_WITH_PARTNER_TOKEN' \
--header 'Accept: application/json'

Return 200 OK with Content-Type: application/json and one complete JSON response. There is no pagination, cursor, page size or incremental-feed requirement. A response taking several minutes is acceptable for the planned background import. Coordinate the expected maximum duration and server/proxy timeouts with Safiri when setting up the integration.

Return every agent on each successful request, including previously imported agents and any agents whose status has changed. Do not return a partial list as a successful response. If the feed cannot be generated, return an appropriate non-success HTTP status so the fetch can be retried. Use 401 or 403 for authentication/access failures and 5xx for temporary server failures.

An empty agents array is valid when your feed genuinely contains no agents; it does not remove records already imported into Safiri.

Complete response example​

Each item represents one agent business. Put its branches or parcel locations inside offices; do not repeat the business as a new agent for every branch. All values below are illustrative. The example includes the required tax and identity documents and office details, plus optional settlement information, storage information and supporting documents. The account holder's profile photo is optional.

{
"schemaVersion": "1",
"agents": [
{
"externalAgentId": "PARTNER-AGENT-001",
"externalBusinessId": "PARTNER-BUSINESS-100",
"status": "active",
"updatedAt": "2026-09-27T09:00:00Z",
"currency": "TZS",
"businessInformation": {
"businessName": "Example Retail Limited",
"tradingName": "Example Supermarket",
"businessAddressName": "Plot 12, Example Road",
"businessAddressCity": "Dar es Salaam",
"businessAddressCountry": "Tanzania",
"businessAddressLatitude": -6.77,
"businessAddressLongitude": 39.24,
"contacts": [
{
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000001"
}
]
},
"personalDetails": {
"externalUserId": "PARTNER-USER-500",
"fullName": "Amina Example",
"email": "amina@example.com",
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000002",
"idType": "National ID",
"idNo": "EXAMPLE-ID-NUMBER",
"gender": "Female",
"ageRange": "30-39"
},
"stakeholders": [
{
"externalStakeholderId": "PARTNER-STAKEHOLDER-001",
"fullName": "Amina Example",
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000002"
}
],
"taxDetails": {
"tinNumber": "EXAMPLE-TIN",
"vatNo": "EXAMPLE-VAT"
},
"accountInformation": {
"accountHolderName": "Example Retail Limited",
"accountNumber": "EXAMPLE-ACCOUNT-NUMBER",
"swiftOrBIC": "EXAMPLE-BIC",
"accountAddressName": "Plot 12, Example Road",
"accountAddressCity": "Dar es Salaam",
"accountAddressCountry": "Tanzania",
"accountAddressLatitude": -6.77,
"accountAddressLongitude": 39.24
},
"mobileMoneyInformation": {
"name": "m-pesa",
"accountHolderName": "Amina Example",
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000002"
},
"documents": {
"businessLicense": "https://partner.example/documents/business-license.pdf",
"certifiedIncorporationOrReg": "https://partner.example/documents/registration.pdf",
"tinOrVatCertificate": "https://partner.example/documents/tax-certificate.pdf",
"premiseTenancy": "https://partner.example/documents/tenancy.pdf",
"nationalIdOrPassport": "https://partner.example/documents/identity.pdf",
"profilePhoto": "https://partner.example/documents/profile.jpg"
},
"digitalServices": {
"travel": {
"busTickets": false,
"flightTickets": false,
"trainTickets": false,
"ferryTickets": false
},
"delivery": {
"parcelPickupAndDropOff": true
},
"rental": {
"carPickupAndDropOff": false,
"rentalBookings": false
}
},
"offices": [
{
"externalOfficeId": "PARTNER-OFFICE-001",
"name": "Example Supermarket — Mikocheni",
"description": "Parcel counter beside the main entrance.",
"country": "Tanzania",
"city": "Dar es Salaam",
"locality": "Mikocheni",
"subLocality": "Mikocheni B",
"latitude": -6.77,
"longitude": 39.24,
"contact": [
{
"externalContactId": "PARTNER-CONTACT-001",
"fullName": "Amina Example",
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000002"
}
],
"customerCare": [
{
"externalContactId": "PARTNER-CONTACT-002",
"fullName": "Example Supermarket Support",
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000003"
}
],
"openingHours": {
"MONDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"TUESDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"WEDNESDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"THURSDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"FRIDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"SATURDAY": {
"openingTime": "09:00",
"closingTime": "18:00",
"isClosed": false
},
"SUNDAY": {
"openingTime": "00:00",
"closingTime": "00:00",
"isClosed": true
}
},
"storageSpace": {
"storageType": "Dedicated indoor storage room",
"totalArea": 200,
"totalAreaUnit": "square feet",
"ceilingHeight": 3,
"ceilingHeightUnit": "meters",
"storageCapacity": {
"small": true,
"medium": true,
"large": true,
"extraLarge": false
},
"securityFeatures": {
"cctv": true,
"alarm": false,
"accessControl": true
},
"storageCondition": {
"temperatureControlled": false,
"weatherProof": true
}
},
"images": [
"https://partner.example/images/office-001-front.jpg",
"https://partner.example/images/office-001-storage.jpg"
]
}
],
"partnerVerification": {
"status": "verified",
"verifiedAt": "2026-09-01T10:00:00Z",
"reference": "PARTNER-VERIFICATION-001"
}
}
]
}

Minimum valid response example​

This example contains the required information for one business, its initial account holder and one office, including tax details, the TIN or VAT certificate, the national ID or passport document, and the office's description, locality, sub-locality, opening hours and images. Additional optional information can be supplied on a later pull using the same external IDs.

{
"schemaVersion": "1",
"agents": [
{
"externalAgentId": "PARTNER-AGENT-001",
"status": "active",
"updatedAt": "2026-09-27T09:00:00Z",
"currency": "TZS",
"businessInformation": {
"businessName": "Example Retail Limited",
"businessAddressName": "Plot 12, Example Road",
"businessAddressCity": "Dar es Salaam",
"businessAddressCountry": "Tanzania",
"businessAddressLatitude": -6.77,
"businessAddressLongitude": 39.24,
"contacts": [
{
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000001"
}
]
},
"personalDetails": {
"externalUserId": "PARTNER-USER-500",
"fullName": "Amina Example",
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000002"
},
"taxDetails": {
"tinNumber": "EXAMPLE-TIN"
},
"documents": {
"tinOrVatCertificate": "https://partner.example/documents/tax-certificate.pdf",
"nationalIdOrPassport": "https://partner.example/documents/identity.pdf"
},
"digitalServices": {
"travel": {
"busTickets": false,
"flightTickets": false,
"trainTickets": false,
"ferryTickets": false
},
"delivery": {
"parcelPickupAndDropOff": true
},
"rental": {
"carPickupAndDropOff": false,
"rentalBookings": false
}
},
"offices": [
{
"externalOfficeId": "PARTNER-OFFICE-001",
"name": "Example Supermarket — Mikocheni",
"description": "Parcel counter beside the main entrance.",
"country": "Tanzania",
"city": "Dar es Salaam",
"locality": "Mikocheni",
"subLocality": "Mikocheni B",
"latitude": -6.77,
"longitude": 39.24,
"contact": [
{
"countryCodeName": "TZ",
"countryCode": "255",
"phoneNumber": "712000002"
}
],
"openingHours": {
"MONDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"TUESDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"WEDNESDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"THURSDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"FRIDAY": {
"openingTime": "08:00",
"closingTime": "20:00",
"isClosed": false
},
"SATURDAY": {
"openingTime": "09:00",
"closingTime": "18:00",
"isClosed": false
},
"SUNDAY": {
"openingTime": "00:00",
"closingTime": "00:00",
"isClosed": true
}
},
"images": [
"https://partner.example/images/office-001-front.jpg"
]
}
]
}
]
}
Optional profile photo

documents.profilePhoto is optional and is omitted from this minimum example. If available, include a profile photo URL as shown in the complete example. This is separate from the office images array, which must contain at least one image.

Field reference​

Required means required whenever the containing object is supplied. An optional section may be omitted entirely; if supplied, its required members must be present. Send actual JSON booleans and numbers, not their string equivalents. Omit unavailable optional information rather than sending null or placeholder values. The EXAMPLE-... values above illustrate the shape only.

Response envelope​

FieldTypeRequiredDescription
schemaVersionstringYesExactly "1".
agentsarray of agent objectsYesThe complete feed. May be empty. Each externalAgentId occurs once.

Agent​

FieldTypeRequiredDescription
externalAgentIdstringYesYour stable identifier for this agent business. Unique within your partner feed.
externalBusinessIdstringNoAn additional business/merchant reference from your system. It is not the import matching key.
statusstringYesactive or inactive. An inactive agent is retained but is not intended to be offered for new parcel bookings.
updatedAtstringYesUTC timestamp of the last change to this agent or any nested supplied information, including offices.
currencystringYesThe business currency; see the supported values below. It does not set or change an existing user's wallet currency.
businessInformationobjectYesBusiness identity, address and contacts.
personalDetailsobjectYesThe initial account holder authorised to represent this business.
stakeholdersarray of objectsNoOther business stakeholders. Listing a stakeholder does not create an account or grant access.
taxDetailsobjectYesTax identification details. tinNumber is required; vatNo is optional when applicable.
accountInformationobjectNoBank settlement details, when applicable to the partner's settlement arrangement.
mobileMoneyInformationobjectNoMobile-money settlement details, when applicable.
documentsobjectYesMust include tinOrVatCertificate and nationalIdOrPassport. Other document fields are optional.
digitalServicesobjectYesExplicit service selections, including parcel pickup/drop-off.
officesarray of objectsYesAt least one physical location. Each externalOfficeId occurs once within the agent.
partnerVerificationobjectNoOptional record of the partner's completed verification.

Supported currency values are TZS, ZMW, MWK, KES, UGX, XAF, CDF, RWF, SLE and USD. These are the current Safiri business currency codes. Agree support with Safiri before supplying another code.

Business information​

FieldTypeRequiredDescription
businessNamestringYesRegistered or recognised business name.
tradingNamestringNoCustomer-facing trading name. On initial creation, defaults to businessName when omitted.
businessAddressNamestringYesBusiness address, such as street, plot or premises description.
businessAddressCitystringYesCity or town.
businessAddressCountrystringYesCountry name, for example Tanzania.
businessAddressLatitudenumberYesLatitude in decimal degrees.
businessAddressLongitudenumberYesLongitude in decimal degrees.
contactsarray of phone objectsYesAt least one business contact. Each item contains the three phone fields below.

Phone formatting​

These fields are used in business contacts, personal details, stakeholders, mobile-money details and office contacts.

FieldTypeRequiredDescription
countryCodeNamestringYesUppercase two-letter country identifier, for example TZ, KE or GB.
countryCodestringYesInternational calling code, 1–5 digits, without +; for example "255".
phoneNumberstringYesNational phone number, 8–13 digits, without the calling code, spaces, punctuation or domestic trunk prefix.

For example, +255 712 000 002 becomes countryCode: "255" and phoneNumber: "712000002". Keep these values as strings.

Account holder and personal details​

FieldTypeRequiredDescription
externalUserIdstringYesStable identifier for the person in your system. Reuse it when the same person represents multiple businesses.
fullNamestringYesAccount holder's full name, at least two characters.
countryCodeName, countryCode, phoneNumberstringsYesAccount holder's phone details, using the phone rules above.
emailstringNoValid email address, when available.
idTypestringNoIdentity document type, for example National ID or Passport.
idNostringNoIdentity document number. Supply idType and idNo together if providing identity details.
genderstringNoOptional personal information collected during partner onboarding.
ageRangestringNoOptional age band, for example 30-39.

A matching contact phone number by itself is not an instruction to transfer an existing Safiri account or its permissions. Changes of account holder must use the new person's own externalUserId; do not reuse another person's identifier.

Stakeholders​

Each supplied stakeholder contains:

FieldTypeRequiredDescription
externalStakeholderIdstringYesStable stakeholder reference within the agent business.
fullNamestringYesStakeholder's full name, at least two characters.
countryCodeName, countryCode, phoneNumberstringsYesStakeholder's phone details.

Tax details​

FieldTypeRequiredDescription
tinNumberstringYesTax identification number. Required for every agent.
vatNostringNoVAT registration number, if applicable.

Bank account information​

Bank details and mobile-money details are independent optional sections. Provide one or both when settlement is made directly to the agent and those details are applicable. They may be omitted for settlement handled centrally by the partner. Supplying these sections does not itself enable payouts.

FieldTypeRequiredDescription
accountHolderNamestringYesName on the account.
accountNumberstringYesAccount number; retain leading zeros.
swiftOrBICstringYesBank's SWIFT/BIC identifier.
accountAddressNamestringYesAddress associated with the account.
accountAddressCitystringYesAddress city or town.
accountAddressCountrystringYesCountry name.
accountAddressLatitudenumberYesAddress latitude in decimal degrees.
accountAddressLongitudenumberYesAddress longitude in decimal degrees.

Mobile-money information​

FieldTypeRequiredDescription
namestringYesMobile-money provider; use a supported literal below.
accountHolderNamestringYesName registered to the mobile-money account.
countryCodeName, countryCode, phoneNumberstringsYesMobile-money account phone details.

Supported provider values are t-pesa, m-pesa, tigo-pesa, airtel-money, halo-pesa, ezy-pesa, zamtel, mtn, telkom, equitel, utl and orange-money. Use these API literals even where a provider's customer-facing brand name differs.

Documents​

Every agent must supply tinOrVatCertificate and nationalIdOrPassport. The other document fields, including profilePhoto, are optional. Supply HTTPS links that Safiri can retrieve under the agreed document-access arrangement. The links do not need to be publicly accessible; arrange access separately from feed authentication.

FieldTypeRequiredDescription
businessLicensestringNoBusiness licence document URL.
certifiedIncorporationOrRegstringNoIncorporation or business registration document URL.
tinOrVatCertificatestringYesTIN or VAT certificate URL.
premiseTenancystringNoEvidence of tenancy or occupancy URL.
nationalIdOrPassportstringYesAccount holder's national ID or passport document URL.
profilePhotostringNoOptional account holder's profile photo URL; may be omitted. Office images are required separately.

Digital services​

Supply all three service groups and their required booleans. Use false for services the business does not provide. In this version, offices inherit the business's selections; office-specific service overrides are not part of the feed.

FieldTypeRequiredDescription
travel.busTicketsbooleanYesBus ticket services.
travel.flightTicketsbooleanYesFlight ticket services.
travel.trainTicketsbooleanYesTrain ticket services.
travel.ferryTicketsbooleanYesFerry ticket services.
delivery.parcelPickupAndDropOffbooleanYesWhether the agent provides parcel collection and drop-off. Use true for an agent offered for these services.
delivery.storageOnlybooleanNoWhether parcel storage without delivery is offered. This does not replace the required pickup/drop-off selection.
rental.carPickupAndDropOffbooleanYesRental-car collection and drop-off.
rental.rentalBookingsbooleanYesRental booking services.

Service selections describe the partner's business. They do not grant Safiri account permissions or configure commissions.

Offices​

Each office represents a physical location belonging to the agent business. For a business with multiple branches, include multiple offices with different, stable externalOfficeId values under the same externalAgentId.

FieldTypeRequiredDescription
externalOfficeIdstringYesStable office identifier within the agent business.
namestringYesCustomer-facing location name.
descriptionstringYesStreet address, landmarks and instructions for finding the parcel counter.
countrystringYesCountry name.
citystringYesCity or town.
localitystringNoDistrict, suburb or locality.
subLocalitystringNoMore specific neighbourhood or area.
latitudenumberYesOffice latitude in decimal degrees.
longitudenumberYesOffice longitude in decimal degrees.
contactarray of contact objectsYesAt least one office contact. The field name is singular: contact.
customerCarearray of contact objectsNoAdditional customer-support contacts.
openingHoursobjectYesWeekly operating hours for all seven days, using the structure below.
storageSpaceobjectNoParcel storage and facilities information.
imagesarray of stringsNoHTTPS image URLs showing the premises, entrance or storage area.

Office contact and customerCare entries share this structure:

FieldTypeRequiredDescription
externalContactIdstringNoStable contact reference from your system, if available.
fullNamestringNoContact person's name or support-team label.
countryCodeName, countryCode, phoneNumberstringsYesContact's phone details.

Opening hours​

Every office must supply openingHours with all seven uppercase day keys: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY and SUNDAY. Times are in the office's local time.

Each day contains:

FieldTypeRequiredDescription
openingTimestringYes24-hour HH:mm time, from 00:00 to 23:59.
closingTimestringYes24-hour HH:mm time.
isClosedbooleanYesWhether the office is closed that day.

For a closed day, set isClosed: true and both times to "00:00". For an open day, an earlier closing time means closing on the following day; equal opening and closing times mean a 24-hour opening period.

Storage and facilities​

FieldTypeRequiredDescription
storageTypestringYesStorage description, for example Dedicated indoor storage room.
totalAreanumberYesPositive storage area, expressed in totalAreaUnit.
totalAreaUnitstringYesCurrent unit literals: square feet, meters, feet. For area, meters and feet denote square metres and square feet respectively.
ceilingHeightnumberYesPositive ceiling height.
ceilingHeightUnitstringYesmeters or feet.
storageCapacity.smallbooleanYesWhether small parcels can be stored.
storageCapacity.mediumbooleanYesWhether medium parcels can be stored.
storageCapacity.largebooleanYesWhether large parcels can be stored.
storageCapacity.extraLargebooleanYesWhether extra-large parcels can be stored.
securityFeatures.cctvbooleanYesCCTV is available.
securityFeatures.alarmbooleanYesAn alarm system is available.
securityFeatures.accessControlbooleanYesStorage access is controlled.
storageCondition.temperatureControlledbooleanYesTemperature-controlled storage is available.
storageCondition.weatherProofbooleanYesStorage is protected from weather.

These capacity flags describe available facilities; they do not define parcel dimensions or override Safiri's parcel booking limits.

Partner verification​

Partner vetting is accepted for automatic onboarding. This optional section records that vetting; it is not a request for a second Safiri application review.

FieldTypeRequiredDescription
statusstringYesExactly verified. The partner has completed its checks.
verifiedAtstringYesUTC timestamp when verification was completed.
referencestringNoYour verification or onboarding reference.

The required tax and identity documents must be supplied whether or not this optional verification record is included. The trusted-partner arrangement applies to the feed. Agent operating status and partnerVerification.status are separate: a verified business may later become inactive.

Shared value rules​

  • External identifiers are non-empty, case-sensitive strings from your system. Do not send Safiri UUIDs or regenerate identifiers on each request.
  • All required text fields must contain a value. Identity numbers, account numbers, tax identifiers and phone details remain strings.
  • Latitude must be a finite JSON number between -90 and 90; longitude must be between -180 and 180. Zero is a valid coordinate, but do not use 0, 0 as a placeholder for an unknown location.
  • updatedAt and verifiedAt use ISO 8601 UTC timestamps, for example 2026-09-27T09:00:00Z. Fractional seconds are allowed.
  • updatedAt records a data change, not the time the feed was fetched. Advance it when supplied business, account-holder, service or office information changes.

Repeat imports and updates​

Safiri will identify an imported agent using the configured partner plus externalAgentId. Two partners may use the same external ID without referring to the same Safiri agent. The partner is determined by the configured connection, not by a field that needs to be repeated in every agent object.

SituationIntended import result
A new externalAgentId is suppliedCreate the local business, offices and associated account membership from the partner data.
An existing agent's supplied data is unchangedSkip business/account/office changes and retain existing records.
An existing agent has changed supplied fieldsUpdate those partner-managed fields while retaining the Safiri identifiers.
Only JSON formatting, object-key order or the fetch time changesDo not recreate the agent. A timestamp alone is not a changed business detail.
An agent gains another officeCreate that office under the existing business using its new externalOfficeId.
An optional field or section is omittedPreserve any previously imported value.
An agent or office is absent from a later responseDo not delete it or infer closure from its absence.
Agent status changes to inactiveRetain its records and history; stop offering the agent for new parcel bookings.

Continue returning complete agent records on every pull, including all required fields. Within a supplied optional section, its required fields still apply. Safiri will update changed supplied information; unchanged fields and omitted optional values will be retained.

Offices are matched by externalOfficeId within the existing agent business. Their order in the array does not identify them. Keep the same ID when an office changes its name, address, phone or operating hours.

For other supplied arrays, such as business contacts, office contacts, stakeholders and images, send the complete current non-empty list for that field. A supplied list updates that field's value; it does not delete related Safiri businesses or user accounts. Omit unavailable optional lists. Clearing fields and deleting records are outside version 1: do not use null, empty strings or empty arrays as clearing instructions.

Examples across successive pulls​

PullPartner dataIntended outcome
FirstPARTNER-AGENT-001 with PARTNER-OFFICE-001Create one business and its first office; provision or resolve the account holder and membership.
SecondSame agent, office and supplied valuesSkip; no duplicate business, office or user.
ThirdSame IDs; change businessInformation.businessAddressName and an office contact's phoneNumber; advance updatedAtUpdate the supplied address and contact data, retaining the same business and office IDs. The account holder's phone is separate and is not changed by an office contact update.
FourthSame agent; include both PARTNER-OFFICE-001 and a new PARTNER-OFFICE-002Retain the existing business and add its second office.
FifthAdd PARTNER-AGENT-002 alongside the unchanged first agentCreate the second agent; skip the unchanged first agent.

Safiri-managed information​

Safiri manages account setup. Your external IDs remain stable partner references. Use the feed contract on this page; it is separate from Safiri's website signup process.

Partner updates maintain imported business and location information. They do not overwrite Safiri passwords, verification credentials, account permissions, wallet balances or currencies, commissions, booking history or operational records. Stakeholders and office contacts are contact information and do not automatically receive user accounts. Changing the account-holder reference does not rename or transfer another person's account.

Safiri will control when imports are triggered and process them in the background. Partners only need to expose this feed; no Safiri import trigger URL is available as part of this documentation release.

Partner readiness checklist​

  • The HTTPS endpoint accepts the agreed bearer token and returns the full schemaVersion: "1" response.
  • Each agent contains the required business, account-holder, tax, document, service and office information. Every office includes a description, locality, sub-locality, opening hours for all seven days and at least one image. Optional supplied sections follow their field definitions.
  • Agent, user and office identifiers stay stable across repeated requests.
  • Unchanged records keep their data timestamps; changed nested details advance the enclosing agent's updatedAt.
  • The endpoint can return the entire list within the duration agreed for the integration, including when that takes several minutes.
  • Safiri has the endpoint URL, feed credentials and any separate access details needed for supplied document or image links.