Repsly Visits API
Export in-store visits (check-in/check-out, GPS, notes), planned visit schedules over a date range, and visit schedule realizations, and import visit schedules to plan representatives' routes.
Export in-store visits (check-in/check-out, GPS, notes), planned visit schedules over a date range, and visit schedule realizations, and import visit schedules to plan representatives' routes.
openapi: 3.0.3
info:
title: Repsly Web API
description: >-
The Repsly Web API (v3) is a REST interface for exchanging data with the
Repsly retail execution and field sales platform. It is designed for ERP/CRM
integration: import (POST) moves clients and products into Repsly, and export
(GET) pulls clients, client notes, visits, retail audits, purchase orders,
document types, products, pricelists, forms, photos, daily working time,
visit schedules, and representatives back out. All requests use HTTP Basic
authentication (API credentials from the Repsly settings page, NOT the login
username/password) over SSL, and accept or return JSON or XML. Export
endpoints return a maximum of 50 records per call; clients iterate using a
timestamp or last-ID cursor and stop when the response
MetaCollectionResult.TotalCount is 0.
Endpoint paths and verbs for the export/import surface are grounded in
Repsly's published v3 developer documentation. Request/response schemas below
are modeled generically (the docs describe fields per entity but do not
publish a machine-readable OpenAPI); treat property-level detail as modeled
and confirm exact field names against the live reference at
https://api.repsly.com/v3/help.
version: '3.0'
contact:
name: Repsly
url: https://www.repsly.com
servers:
- url: https://api.repsly.com/v3
description: Repsly Web API v3 (production)
security:
- basicAuth: []
tags:
- name: Clients
description: Export and import clients and client notes.
- name: Representatives
description: Export representatives, users, and daily working time.
- name: Visits
description: Export visits, visit schedules, and realizations; import schedules.
- name: Products
description: Export and import products, product lists, packages, and document types.
- name: Forms
description: Export completed forms and retail audits.
- name: Photos
description: Export photos captured in the field.
- name: Pricelists
description: Export and import pricelists and pricelist items.
- name: Purchase Orders
description: Export purchase orders and update sales document status.
- name: Import
description: Bulk import surface and import job status.
paths:
/export/clients/{lastTimestamp}:
get:
operationId: exportClients
tags: [Clients]
summary: Export clients
description: >-
Returns up to 50 clients changed since the given timestamp. Start with
lastTimestamp = 0 to get the full list, then pass the returned
MetaCollectionResult.LastTimeStamp until TotalCount is 0.
parameters:
- $ref: '#/components/parameters/LastTimestamp'
responses:
'200':
description: A batch of clients with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/ClientCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/clientnotes/{lastClientNoteID}:
get:
operationId: exportClientNotes
tags: [Clients]
summary: Export client notes
description: >-
Returns up to 50 client notes with an ID greater than lastClientNoteID.
Start with 0 and page using MetaCollectionResult.LastID until TotalCount
is 0.
parameters:
- $ref: '#/components/parameters/LastClientNoteID'
responses:
'200':
description: A batch of client notes with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/import/client:
post:
operationId: importClients
tags: [Clients]
summary: Import clients
description: >-
Insert or update one or more clients. Repsly decides per record whether
to insert or update. Returns an ImportResult with an importJobID that can
be polled via /export/importStatus/{importJobID}.
requestBody:
$ref: '#/components/requestBodies/ImportBody'
responses:
'200':
$ref: '#/components/responses/ImportAccepted'
'401':
$ref: '#/components/responses/Unauthorized'
/export/representatives:
get:
operationId: exportRepresentatives
tags: [Representatives]
summary: Export representatives
description: >-
Returns all field representatives on the account, including their
territories, roles, and active status.
responses:
'200':
description: A collection of representatives.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/users:
get:
operationId: exportUsers
tags: [Representatives]
summary: Export users
description: >-
Returns the account's users. Path grounded in Repsly's v3 reference;
pagination/cursor parameters are modeled - confirm against the live
reference.
responses:
'200':
description: A collection of users.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/dailyworkingtime/{lastDailyWorkingTimeID}:
get:
operationId: exportDailyWorkingTime
tags: [Representatives]
summary: Export daily working time
description: >-
Returns up to 50 daily working time records with an ID greater than
lastDailyWorkingTimeID. Page using MetaCollectionResult.LastID until
TotalCount is 0.
parameters:
- name: lastDailyWorkingTimeID
in: path
required: true
description: Last daily working time ID already retrieved; start at 0.
schema:
type: integer
format: int64
responses:
'200':
description: A batch of daily working time records.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/visits/{lastTimestamp}:
get:
operationId: exportVisits
tags: [Visits]
summary: Export visits
description: >-
Returns up to 50 visits changed since the given timestamp. Start with 0
and page using MetaCollectionResult.LastTimeStamp until TotalCount is 0.
parameters:
- $ref: '#/components/parameters/LastTimestamp'
responses:
'200':
description: A batch of visits with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/visitschedules/{beginDateTime}/{endDateTime}:
get:
operationId: exportVisitSchedules
tags: [Visits]
summary: Export visit schedules
description: >-
Returns planned visit schedules between beginDateTime and endDateTime
(inclusive), for all representatives.
parameters:
- name: beginDateTime
in: path
required: true
description: Start of the date range (e.g. 2026-07-01).
schema:
type: string
- name: endDateTime
in: path
required: true
description: End of the date range (e.g. 2026-07-31).
schema:
type: string
responses:
'200':
description: A collection of visit schedules.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/visit-realizations:
get:
operationId: exportVisitRealizations
tags: [Visits]
summary: Export visit schedule realizations
description: >-
Returns visit schedule realizations - how planned schedules were actually
executed. Path grounded in Repsly's v3 reference; cursor parameters are
modeled.
responses:
'200':
description: A collection of visit realizations.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/import/schedule:
post:
operationId: importSchedules
tags: [Visits]
summary: Import visit schedules
description: >-
Insert or update visit schedules to plan representatives' routes. Returns
an importJobID for status polling.
requestBody:
$ref: '#/components/requestBodies/ImportBody'
responses:
'200':
$ref: '#/components/responses/ImportAccepted'
'401':
$ref: '#/components/responses/Unauthorized'
/export/products/{lastTimestamp}:
get:
operationId: exportProducts
tags: [Products]
summary: Export products
description: >-
Returns products from the catalog. Resource and path grounded in Repsly's
v3 reference; the timestamp cursor form is modeled after the other export
endpoints - confirm against the live reference.
parameters:
- $ref: '#/components/parameters/LastTimestamp'
responses:
'200':
description: A batch of products.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/product-lists:
get:
operationId: exportProductLists
tags: [Products]
summary: Export product lists
description: >-
Returns product lists (groupings of products). Path grounded in Repsly's
v3 reference.
responses:
'200':
description: A collection of product lists.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/documentTypes/:
get:
operationId: exportDocumentTypes
tags: [Products]
summary: Export document types
description: >-
Returns the document types configured on the account (used to classify
sales documents and purchase orders).
responses:
'200':
description: A collection of document types.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/import/product:
post:
operationId: importProducts
tags: [Products]
summary: Import products
description: >-
Insert or update products in the catalog. Returns an importJobID for
status polling.
requestBody:
$ref: '#/components/requestBodies/ImportBody'
responses:
'200':
$ref: '#/components/responses/ImportAccepted'
'401':
$ref: '#/components/responses/Unauthorized'
/import/package:
post:
operationId: importPackages
tags: [Products]
summary: Import product packages
description: >-
Insert or update product packaging definitions. Returns an importJobID
for status polling.
requestBody:
$ref: '#/components/requestBodies/ImportBody'
responses:
'200':
$ref: '#/components/responses/ImportAccepted'
'401':
$ref: '#/components/responses/Unauthorized'
/export/retailaudits/{lastRetailAuditID}:
get:
operationId: exportRetailAudits
tags: [Forms]
summary: Export retail audits
description: >-
Returns up to 50 retail audits with an ID greater than lastRetailAuditID.
Start with 0 and page using MetaCollectionResult.LastID until TotalCount
is 0.
parameters:
- name: lastRetailAuditID
in: path
required: true
description: Last retail audit ID already retrieved; start at 0.
schema:
type: integer
format: int64
responses:
'200':
description: A batch of retail audits with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/forms/{lastFormID}:
get:
operationId: exportForms
tags: [Forms]
summary: Export forms
description: >-
Returns up to 50 completed forms with an ID greater than lastFormID.
Start with 0 and page using MetaCollectionResult.LastID until TotalCount
is 0. A matrix variant returns matrix-style form answers.
parameters:
- name: lastFormID
in: path
required: true
description: Last form ID already retrieved; start at 0.
schema:
type: integer
format: int64
responses:
'200':
description: A batch of forms with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/photos/{lastPhotoID}:
get:
operationId: exportPhotos
tags: [Photos]
summary: Export photos
description: >-
Returns up to 50 photos with an ID greater than lastPhotoID, including
metadata and image URLs. Start with 0 and page using
MetaCollectionResult.LastID until TotalCount is 0.
parameters:
- name: lastPhotoID
in: path
required: true
description: Last photo ID already retrieved; start at 0.
schema:
type: integer
format: int64
responses:
'200':
description: A batch of photos with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/pricelists/:
get:
operationId: exportPricelists
tags: [Pricelists]
summary: Export pricelists
description: Returns the list of pricelists configured on the account.
responses:
'200':
description: A collection of pricelists.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/export/pricelists/{pricelistID}:
get:
operationId: exportPricelistItems
tags: [Pricelists]
summary: Export pricelist items
description: Returns the items (products and prices) within a specific pricelist.
parameters:
- name: pricelistID
in: path
required: true
description: The ID of the pricelist whose items to export.
schema:
type: integer
format: int64
responses:
'200':
description: A collection of pricelist items.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/import/pricelist:
post:
operationId: importPricelists
tags: [Pricelists]
summary: Import pricelists
description: >-
Insert or update pricelists and their items. Returns an importJobID for
status polling.
requestBody:
$ref: '#/components/requestBodies/ImportBody'
responses:
'200':
$ref: '#/components/responses/ImportAccepted'
'401':
$ref: '#/components/responses/Unauthorized'
/export/purchaseorders/{lastDocumentID}:
get:
operationId: exportPurchaseOrders
tags: [Purchase Orders]
summary: Export purchase orders
description: >-
Returns up to 50 purchase orders with a document ID greater than
lastDocumentID. Start with 0 and page using MetaCollectionResult.LastID
until TotalCount is 0.
parameters:
- name: lastDocumentID
in: path
required: true
description: Last document ID already retrieved; start at 0.
schema:
type: integer
format: int64
responses:
'200':
description: A batch of purchase orders with collection metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericCollection'
'401':
$ref: '#/components/responses/Unauthorized'
/import/sales-document-status:
post:
operationId: updateSalesDocumentStatus
tags: [Purchase Orders]
summary: Update sales document status
description: >-
Post a status update back to a sales document (e.g. a purchase order)
after it is processed in the back office. Path grounded in Repsly's v3
reference; body fields are modeled.
requestBody:
$ref: '#/components/requestBodies/ImportBody'
responses:
'200':
$ref: '#/components/responses/ImportAccepted'
'401':
$ref: '#/components/responses/Unauthorized'
/export/importStatus/{importJobID}:
get:
operationId: getImportStatus
tags: [Import]
summary: Get import job status
description: >-
Returns the status of a previously submitted import job, identified by
the importJobID returned from an import (POST) call.
parameters:
- name: importJobID
in: path
required: true
description: The import job ID returned by an import call.
schema:
type: string
responses:
'200':
description: The status of the import job.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportResult'
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
basicAuth:
type: http
scheme: basic
description: >-
HTTP Basic authentication over SSL. Use the API username and password
from the Repsly settings page (API Settings) - these differ from your
Repsly login credentials.
parameters:
LastTimestamp:
name: lastTimestamp
in: path
required: true
description: >-
Timestamp cursor. Start at 0 for a full export, then pass the returned
MetaCollectionResult.LastTimeStamp on each subsequent call.
schema:
type: integer
format: int64
LastClientNoteID:
name: lastClientNoteID
in: path
required: true
description: Last client note ID already retrieved; start at 0.
schema:
type: integer
format: int64
requestBodies:
ImportBody:
required: true
description: >-
A batch of entities to insert or update. Repsly decides per record
whether to insert or update. Accepts JSON or XML; field schema depends on
the entity being imported.
content:
application/json:
schema:
type: object
additionalProperties: true
responses:
Unauthorized:
description: Missing or invalid Basic authentication credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ImportAccepted:
description: The import was accepted; the result includes an importJobID.
content:
application/json:
schema:
$ref: '#/components/schemas/ImportResult'
schemas:
MetaCollectionResult:
type: object
description: >-
Pagination metadata returned with export collections. Iterate until
TotalCount is 0.
properties:
TotalCount:
type: integer
description: Total count of records in this batch (0 means no more records).
LastTimeStamp:
type: integer
format: int64
description: Timestamp cursor for the next request (timestamp-paged endpoints).
FirstID:
type: integer
format: int64
description: Unique ID of the first item in the list (ID-paged endpoints).
LastID:
type: integer
format: int64
description: Unique ID of the last item in the list (ID-paged endpoints).
GenericCollection:
type: object
description: >-
Generic export collection envelope. Each export endpoint returns an
entity array plus MetaCollectionResult; entity fields are documented per
resource in the Repsly reference and are modeled here.
properties:
MetaCollectionResult:
$ref: '#/components/schemas/MetaCollectionResult'
Data:
type: array
items:
type: object
additionalProperties: true
ClientCollection:
type: object
properties:
MetaCollectionResult:
$ref: '#/components/schemas/MetaCollectionResult'
Clients:
type: array
items:
$ref: '#/components/schemas/Client'
Client:
type: object
description: >-
A Repsly client (retail location / account). Fields modeled from the v3
reference; confirm exact names against the live documentation.
properties:
ClientID:
type: integer
format: int64
Code:
type: string
Name:
type: string
Active:
type: boolean
Address1:
type: string
City:
type: string
Country:
type: string
Email:
type: string
Phone:
type: string
ImportResult:
type: object
description: Result of an import (POST) call, including the job identifier.
properties:
importJobID:
type: string
status:
type: string
Error:
type: object
properties:
code:
type: string
message:
type: string